#!/usr/bin/python
import re
import os

def find_file(filename, start_path):
  """
  根据文件名查找给定目录下的文件路径。

  Args:
    filename: 要查找的文件名。
    start_path: 开始搜索的目录路径。

  Returns:
    如果找到文件，则返回文件的绝对路径；否则，返回 None。
  """
  for root, _, files in os.walk(start_path):
    for file in files:
      if file == filename:
        return os.path.join(root, file)
  return None

def run_cmd_4(command):
    """
    运行CMD命令并返回输出结果

    参数：
    command (str): 要执行的CMD命令

    返回：
    output (str): 命令执行的输出结果
    """
    try:
        output = os.popen(command).read()
        output = output.strip()
        return output
    except Exception as e:
        output = str(e)
        return output

def parse_log(log_file):
  """
  解析日志文件并提取地址和库文件名。

  Args:
    log_file: 日志文件的路径。

  Returns:
    一个列表，其中每个元素是一个字典，包含地址和库文件名。
  """
  results = []
  with open(log_file, 'r') as f:
    for line in f:
      match = re.search(r'[^#]*#(\d+) pc ([0-f]+) ([^(]*)\((.*)\)', line)
      if match:
        frame_id = match.group(1)
        address = match.group(2)
        filename = match.group(3)
        func = match.group(4)
        result = {'frame_id': frame_id, 'address': address, 'filename': os.path.basename(filename), 'path':os.path.dirname(filename),"func":func}
        sofile_path = find_file(result['filename'], "out/rk3588/lib.unstripped")
        if sofile_path:
          output = run_cmd_4("./addr2line.sh "+ sofile_path+" 0x"+address)
          result['out'] = output
        results.append(result)
  return results

if __name__ == '__main__':
  log_file = 'mylog.txt'  # 替换为实际的日志文件路径
  results = parse_log(log_file)
  for result in results:
    print("#%s %s(%s)"%(result['frame_id'], result['out'],result['func']))